package fiuba.algo3.algoThieft.modelo;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class Personaje implements PersonajePolicial {
	private static final int ARRESTOS_PARA_SER_DETECTIVE = 5;
	private static final int ARRESTOS_PARA_SER_INVESTIGADOR = 10;
	private static final int ARRESTOS_PARA_SER_SARGENTO = 20; 
	
	private String nombre;
	private Rango rango;
	private Capital ubicacion;
	private int cantidadArrestos;
	
	public Personaje (String nombre){
		this.nombre = nombre;
		this.cantidadArrestos = 0;
		this.rango = new Novato();
	}
	
	public static Personaje crearPersonaje (Node nodo) {
        Element elementoPersonaje = ( Element ) nodo;
        String nombre = elementoPersonaje.getAttribute( "nombre" );
        Personaje personaje = new Personaje (nombre);
       
        int arrestos = Integer.parseInt( elementoPersonaje.getAttribute("arrestos") );
        
        for ( int i=0 ; i < arrestos ; i++ ){
                personaje.agregarArrestoExitoso();
        }
        
        return personaje;
        
	}

	public String rangoComoString() {
        return this.rango.comoString();
	}
	
	public void setRango (Rango nuevoRango){
	        this.rango = nuevoRango; 
	}
	
	public Capital getUbicacion (){
	        return this.ubicacion;
	}
	
	private void verificarRango (){
	        if ( this.cantidadArrestos == ARRESTOS_PARA_SER_DETECTIVE ){
	                this.setRango( new Detective() );
	                return;
	        }
	        if ( this.cantidadArrestos == ARRESTOS_PARA_SER_INVESTIGADOR ){
	                this.setRango( new Investigador() );
	                return;
	        }
	        if ( this.cantidadArrestos == ARRESTOS_PARA_SER_SARGENTO ){
	                this.setRango( new Sargento() );
	                return;
	        }
	}
	
	public void agregarArrestoExitoso() {
	        this.cantidadArrestos+=1;
	        this.verificarRango();
	}
	
	public Pista recibirPista(Lugar lugar) {
	        Pista pista = rango.recibirPista(lugar);
	        return pista;
	}
	
	public int getVelocidadEnKilometrosPorHora (){
	        return this.rango.getVelocidadEnKilometrosPorHora();
	}
	
	public void viajar (Capital lugarDestino) {
	        this.ubicacion = lugarDestino ;
	}
	
	public String getNombre() {
	        return this.nombre;
	}
	
	public Node serializar(Document doc) {
	        Element element = doc.createElement("Personaje");
	                        element.setAttribute("nombre", this.nombre );
	        element.setAttribute("arrestos", Integer.toString( this.cantidadArrestos ) );
	                        
	        return element;
	}
	
	public void setUbicacionInicial(Capital ubicacionInicial) {
	        this.ubicacion = ubicacionInicial;
	        
	}
	
	@Override
	public int getCantidadDeArrestos() {
	        
	        return this.cantidadArrestos;
	}

	public ObjetoRobado recibirObjetoRobadoARecuperar(Caso caso) {
		return this.rango.recibirObjetoRobadoARecuperar(caso);
	}
	
}